package com.jxtpro.config;

import org.beetl.core.GroupTemplate;
import org.beetl.ext.jfinal.BeetlRenderFactory;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.ext.plugin.shiro.ShiroInterceptor;
import com.jfinal.ext.plugin.shiro.ShiroPlugin;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfplugin.mail.MailPlugin;
import com.jxtpro.config.routes.JRoutes;
import com.jxtpro.config.shiro.ShiroExt;
import com.jxtpro.model._MappingKit;

/**
 * API引导式配置
 */
public class JxtProConfig extends JFinalConfig {
	private Routes routes;
	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		PropKit.use("jxtpro.properties");
//		me.setDevMode(PropKit.getBoolean("devMode", true));
//		me.setViewType(ViewType.JSP);
		me.setDevMode(true);
		//RequiresRoles，RequiresPermissions授权异常，如果没有权限访问对应的资源，返回HTTP状态码403。
		me.setErrorView(401, "view/404.html");
		me.setErrorView(403, "view/403.html");
		me.setError404View("view/404.html");
		me.setError500View("view/500.html");
		
 //Beetl
		me.setMainRenderFactory(new BeetlRenderFactory());
		// 获取GroupTemplate ,可以设置共享变量等操作
		GroupTemplate gt = BeetlRenderFactory.groupTemplate ;
		gt.registerFunctionPackage("so",new ShiroExt());
//		gt.setStatementStart("<%");
//		gt.
//		gt.setStatementEnd("%>");
		
//Beetl 自定义
//		Map<String,Object> shared = new HashMap<String,Object>();
//		shared.put("jstproPath", "/jfinal_demo/jstpro_00002");
//		shared.put("ctxPath", "/jfinal_demo");
//		gt.setSharedVars(shared);
	}
	
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add(new JRoutes());	// 第三个参数为该Controller的视图存放路径
		this.routes = me;
	}	
	
	public static C3p0Plugin createC3p0Plugin() {
		return new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
	}
	
	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		

		me.add(new MailPlugin(PropKit.use("mail.properties").getProperties()));
		
		// 配置C3p0数据库连接池插件
		C3p0Plugin c3p0Plugin = createC3p0Plugin();
		me.add(c3p0Plugin);
		
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
		arp.setShowSql(true);//这句话就是ShowSql
		me.add(arp);
		// 所有配置在 MappingKit 中搞定
		_MappingKit.mapping(arp);
		
		// ActiveRecord插件
		// 加载Shiro插件
		 me.add(new ShiroPlugin(routes));
		// 缓存插件
		me.add(new EhCachePlugin());		
	}
	
	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		
		me.add(new ShiroInterceptor());
	}
	
	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		me.add(new ContextPathHandler("base_path"));
	}
	
	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目
	 * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 */
//   public static void main(String[] args) {
//		JFinal.start("WebRoot", 8080, "/", 5);
//	}
}
